home *** CD-ROM | disk | FTP | other *** search
/ Run Magazine ReRun 1989 Special Issue / rerun-1989-special-issue.d64 / irq source#7 < prev    next >
Text File  |  2022-09-20  |  4KB  |  97 lines

  1.  
  2. ;MODIFIED FLYING BALLS - BOUNCING BALLS
  3. ;WITH RASTER COMPARE GENERATED INTERRUPT
  4. ;AND SPRITE TO FOREGROUND COLLISION DETECTION
  5. ;
  6. EXP
  7.       LDA #$1B            ;Initialize VIC-II registers
  8.       STA $D011           ;Control Register - 8th bit of
  9.                           ;Raster Compare
  10.       LDA #0
  11.       STA $D012           ;Raster Compare Register
  12.       LDA #$03
  13.       STA $D01A           ;Interrupt Enable - ERST and EMBC
  14.       STA $DC0D           ;Turn off Timer A interrupt from CIA 1
  15.       RTS
  16. ICHECK
  17.       LDA $D019           ;Get Interrupt Flag Register
  18.       AND #$02            ;Check if IMBC has occurred
  19.       BNE COLLISION       ;If YES - then go to collision routine
  20.       LDA #$01            ;If NO - Turn off Raster Compare Latch
  21.       STA $D019
  22.       LDA $D01F           ;Clear Sprite - Foreground
  23.                           ;Collision Register
  24.       JMP CONT            ;Jump to ball animation routine
  25. COLLISION
  26.       LDA $D01F           ;Get Sprite to Foreground
  27.                           ;Collision Register
  28.       LDY #$07            ;Set Y to 7 - Sprite Number Pointer
  29.       LDX #$00            ;Set X to 0 - Sprite Collision Pointer
  30. SHIFT
  31.       ASL                 ;Check if collision occurred
  32.                           ;with Sprite Y
  33.       BCC NOCOLL          ;If NO - try next Sprite
  34.       PHA                 ;If YES -
  35.       TYA
  36.       STA CSPRITE,X       ;Save Sprite Number
  37.       PLA
  38.       INX                 ;Increment Sprite Collision Pointer
  39. NOCOLL
  40.       DEY                 ;Decrement Sprite Number Pointer
  41.       BPL SHIFT           ;If not all sprites checked,
  42.                           ;do next one
  43.       DEX                 ;Point to last sprite
  44.                           ;collision detected
  45. NEXTA 
  46.       LDA CSPRITE,X       ;Get Sprite Number
  47.       TAY                 ;Put SN in Y
  48.       PHA                 ;Save SN to the Stack
  49.       LDA MASK,Y          ;Get MSB mask for Sprite
  50.       STA $FE             ;Store in zero page location $FE
  51.       PLA                 ;Get SN back off stack
  52.       ASL                 ;Multiply by 2
  53.       TAY                 ;Put new pointer in Y
  54.       LDA $D000,Y         ;Get X location of Sprite
  55.       PHA                 ;Save to the Stack
  56.       CMP #$1C            ;Check if collision is at left border
  57.       BCS NOTLEFT         ;If not check right side
  58.       LDA $FE             ;Get MSB mask - Check MSB
  59.                           ;Register to make
  60.       AND $D010           ;sure Sprite is at the left side
  61.       BNE NOTLEFT         ;If NO then check right side
  62.       LDA #0              ;Change X direction of Sprite
  63.       STA SD,Y            ;Save to Sprite Direction data
  64. NOTLEFT
  65.       PLA                 ;Get X location back from stack
  66.       CMP #$3D            ;Check if at right border
  67.       BCC NOTRIGHT        ;If NO - check top of screen
  68.       LDA $FE             ;Get MSB mask
  69.       AND $D010           ;Check MSB bit
  70.       BEQ NOTRIGHT        ;If not at right - check top of screen
  71.       LDA #$80            ;Change X direction of Sprite
  72.       STA SD,Y            ;Save to Sprite Direction data
  73. NOTRIGHT
  74.       INY                 ;Point to Y value of Sprite Location
  75.       LDA $D000,Y         ;Get Y value of Sprite Location
  76.       CMP #$35            ;Check if at top border
  77.       BCS NOTTOP          ;If NO - then check bottom of screen
  78.       LDA #0              ;Change Sprite Y Direction
  79.       STA SD,Y
  80. NOTTOP
  81.       CMP #$E2            ;Check if at bottom border
  82.       BCC NOTBOTTOM       ;If NO - Leave
  83.       LDA #$80            ;Change Sprite Y Direction
  84.       STA SD,Y
  85. NOTBOTTOM
  86.       DEX                 ;Decrement Sprite Collision Pointer
  87.       BPL NEXTA           ;If more sprites - Check next sprite
  88.       LDA #$02            ;Clear Sprite to Foreground
  89.                           ;Interrupt Latch
  90.       STA $D019
  91.       JMP $EA81           ;Jump to KERNAL IRQ exit routine
  92. CSPRITE
  93.       .BYTE 0 0 0 0 0 0 0 0 ;Sprites that collided
  94. MASK
  95.       .BYTE 1 2 4 8 16 32 64 128 ;Mask values
  96.  
  97.